<?php

include_once '../Interfaces/XMLInterface.php';
include_once '../InfoManager/InfoManager.php';
include_once '../Exceptions/CommunicationException.php';
include_once '../Exceptions/MuchParametersException.php';
include_once '../Model/GPS.php';

/**
 * contenitore per le informazioni di base del percorso
 * e tutti gli step forniti da atac
 * @author Laura Magrini
 *
 */
class StepRoute implements XMLInterface {
	
	
	private $start;
	private $end;
	private $dd, $mo, $yy, $hh, $min, $mezzo;
	
	private $elementStart;
	private $elementEnd;
	
	
	/**
	 * Costruttore per gli oggetti di classe BusStop
	 * @param String $stopName
	 * @param String $atacID
	 * @return un oggetto di classe BusStop
	 */
	function __construct($start, $end, $dd=null, $mo=null, $yy=null, $hh=null, $min=null, $mezzo=null) {
		$this->start = $start;
		$this->end = $end;
		
		if ($start==null)
			echo "Inserisci punto di partenza!";
		if ($end==null)
			echo "Inserisci punto di arrivo!";	
		
		$this->dd = $dd;
		$this->mo = $mo;
		$this->yy = $yy;
		$this->hh = $hh;
		$this->min = $min;
		$this->mezzo=$mezzo;
			
		$this->elementStart = "<ROUTE>";
		$this->elementEnd = "</ROUTE>";
	}
	
	
	/**
	 * Rende l'indirizzo di partenza. Null se questo non era stato impostato
	 * @return String Start
	 */
	function getStart() {
		return $this->start;
	}
	
	
	/**
	 * Rende l'indirizzo di arrivo. Null se questo non era stato impostato
	 * @return String end
	 */
	function getEnd() {
		return $this->end;
	}
	
	function getdd() {
		return $this->dd;
	}
	
	function getyy() {
		return $this->yy;
	}
	
	function getmo() {
		return $this->mo;
	}
	
	function gethh() {
		return $this->hh;
	}
	
	function getmin() {
		return $this->min;
	}
	
	function getmezzo() {
		return $this->mezzo;
	}
	
	
	/**
	 * Rende l'elenco dei passi da eseguire per il percorso
	 * Lancia un eccezione di tipo CommunicationException in caso di problemi
	 * di comunicazione con atac
	 * @return Array una lista di StepofRoute
	 */
	function getStep() {
		//Chiama il metodo presente in ACRoutePlanner passando start e end
		$acroute = new ACRoutePlanner();
		return $acroute->getPathFromHereToThere($this);
	}
	
	
	/**
	 * Sintetizza l'oggetto in xml. Lancia un'eccezione di tipo CommunicationException
	 * in caso di problemi di comunicazione con Atac
	 * @see src/Interfaces/XMLInterface#toXML()
	 */
	function toXML($mode) {
		$xml=$this->baseinfo();
		//compact mode: qui dentro non posso richiamare altri metodi toXML
		if ($mode == COMPACT_MODE) {	
			
		}
		
		//extended mode qui dentro posso chiamare solo metodi toXML in modalita compact
		if ($mode == EXTENDED_MODE) 
		{
			$steps = $this->getStep(); //chiamo  il metoso che gestisce AtacCommunicator
			
			//gestire file XML
			$xml = $xml."\n<STEPSLIST>\n";
			if ($steps!=null)
			foreach ($steps as $step)
			{
					$xml = $xml.$step->toXML(COMPACT_MODE);
			}
			$xml = $xml."\n</STEPSLIST>\n";
		}
		$xml = $this->elementStart."\n".$xml."\n".$this->elementEnd."\n"; 
		return $xml;
		
	}
	
	
	
	function getDistance() {
		
		return $this->distance;
		
	}
	
	function setDistance($distance) {
		
		$this->distance = $distance;
		
	}
	
	
	/**
	 * (non-PHPdoc)
	 * @see src/Interfaces/XMLInterface#getElementStartTag()
	 */
	function getElementStartTag() {
		return $this->elementStart;	
	}
	
	/**
	 * (non-PHPdoc)
	 * @see src/Interfaces/XMLInterface#getElementEndTag()
	 */
	function getElementEndTag() {
		return $this->elementEnd;	
	}
	
	
	function getRouteFromStart($step){
		$xml=$this->baseinfo();
		$steps = $step->getStep();
		$xml = $xml."\n<STEPSLIST>\n";
			if ($steps!=null){
				foreach ($steps as $step)
				{
					$xml = $xml.$step->toXML(EXTENDED_MODE);
				}
			}		
			$xml = $xml."\n</STEPSLIST>\n";
			$xml = $this->elementStart."\n".$xml."\n".$this->elementEnd."\n";
			return $xml;
	}
	
	//ritorna le informazioni di base sulla partenza e l'arrivo
	function baseinfo(){
		$xml = "";
		$coord=$this->start->getGPS();
		$xml = $xml."<START>\n";
			$xml = $xml."<VIA>".$this->start->getAddress()."</VIA>\n";
			$xml = $xml."<LAT>".$coord->getLat()."</LAT>\n";
			$xml = $xml."<LONG>".$coord->getLon()."</LONG>\n";
		$xml = $xml."</START>\n";
		$coord=$this->end->getGPS();
		$xml = $xml."<END>\n";
			$xml = $xml."<VIA>".$this->end->getAddress()."</VIA>\n";
			$xml = $xml."<LAT>".$coord->getLat()."</LAT>\n";
			$xml = $xml."<LONG>".$coord->getLon()."</LONG>\n";
		$xml = $xml."</END>\n";
		$xml = $xml."<MODE>".$this->mezzo."</MODE>\n";
		return $xml;
	}
}
?>
